/**
 * 
 */
package com.ginger.zookeeper;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Description: ZooKeeper连接
 * @author 姜锋
 * @date 2018年8月19日 下午5:44:11
 * @version V1.0
 */
public class ZKConnect implements Watcher {
	final static Logger log = LoggerFactory.getLogger(ZKConnect.class);
	// 服务端地址
	public static final String connectionString = "www.justginger.top:2181,www.justginger.top:2182,www.justginger.top:2183";
	// session过期时间
	public static final Integer sessionTimeout = 5000;

	/**
	 * @Description: 初始化Zookeeper连接
	 * @author 姜锋
	 * @date 2018年8月19日 下午6:16:12
	 * @param @throws Exception
	 * @return void
	 * @throws Exception 
	 * @throws 客户端与zk服务端连接是一个异步的过程 当连接成功后.客户端会收到一个watch通知 参数: connectionString:连接服务端的IP字符串
	 *             比如:"IP:PORT,IP:PORT,IP:PORT,IP:PORT"; sessionTimeout 超时时间,心跳收不到,那就超时鱼 watcher
	 *             :通知事件,如有对应的事件触发,则会收到一个通知,,如不需要,那就设置为null canBeReadOnly: 可读
	 *             当这个物理机节点断开后,还是可以读取到数据,只是不能写 此时数据被被读取到的可有是旧数据,此处简体设置为false,不推荐使用 sessionID 会话的id
	 *             sessionPassword 会话密码,当会话丢失后,可以通过sessionID和sessionPassword重新获取会话
	 */
	public static void inintConncet() throws Exception {
		ZooKeeper zk = new ZooKeeper(connectionString, sessionTimeout, new ZKConnect());
		
		log.debug("客户端开始连接ZooKeeper服务器....");
		log.debug("连接状态{}" + zk.getState());
	
		// 等俩秒再试一下
		Thread.sleep(2000);
		log.debug("连接状态{}" + zk.getState());
		long sessionId = zk.getSessionId();
		byte[] sessionPassword = zk.getSessionPasswd();
		log.debug("获取当前的session: "+sessionId+"当前的session密码:  "+sessionPassword);
		Thread.sleep(2000);
		log.debug("开始重新连接session");
		ZooKeeper zk1 = new ZooKeeper(connectionString, sessionTimeout, new ZKConnect(), sessionId, sessionPassword);
		
		log.debug("重新连接状态{}" + zk1.getState());
		Thread.sleep(2000);
		log.debug("重新连接状态{}" + zk1.getState());
		sessionId = zk1.getSessionId();
		sessionPassword = zk1.getSessionPasswd();
		log.debug("获取当前的session: "+sessionId+"当前的session密码:  "+sessionPassword);
		
	}
	
	
	@Override
	public void process(WatchedEvent event) {
		log.debug("接收到watch通知:{}" + event);
	}
	
	public static void main(String[] args) {
		try {
			inintConncet();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
